// ASM: a very small and fast Java bytecode manipulation framework
// Copyright (c) 2000-2011 INRIA, France Telecom
// All rights reserved.
//
// Redistribution and use in source and binary forms, with or without
// modification, are permitted provided that the following conditions
// are met:
// 1. Redistributions of source code must retain the above copyright
//    notice, this list of conditions and the following disclaimer.
// 2. Redistributions in binary form must reproduce the above copyright
//    notice, this list of conditions and the following disclaimer in the
//    documentation and/or other materials provided with the distribution.
// 3. Neither the name of the copyright holders nor the names of its
//    contributors may be used to endorse or promote products derived from
//    this software without specific prior written permission.
//
// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS"
// AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
// IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
// ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE
// LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
// CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
// SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
// INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
// CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
// ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
// THE POSSIBILITY OF SUCH DAMAGE.

package xyz.noark.asm;

/**
 * Information about a class being parsed in a {@link ClassReader}.
 *
 * @author Eric Bruneton
 */
final class Context {

	/** The prototypes of the attributes that must be parsed in this class. */
	Attribute[] attributePrototypes;

	/**
	 * The options used to parse this class. One or more of
	 * {@link ClassReader#SKIP_CODE}, {@link ClassReader#SKIP_DEBUG},
	 * {@link ClassReader#SKIP_FRAMES}, {@link ClassReader#EXPAND_FRAMES} or
	 * {@link ClassReader#EXPAND_ASM_INSNS}.
	 */
	int parsingOptions;

	/** The buffer used to read strings in the constant pool. */
	char[] charBuffer;

	// Information about the current method, i.e. the one read in the current
	// (or latest) call
	// to {@link ClassReader#readMethod()}.

	/** The access flags of the current method. */
	int currentMethodAccessFlags;

	/** The name of the current method. */
	String currentMethodName;

	/** The descriptor of the current method. */
	String currentMethodDescriptor;

	/**
	 * The labels of the current method, indexed by bytecode offset (only
	 * bytecode offsets for which a label is needed have a non null associated
	 * Label).
	 */
	Label[] currentMethodLabels;

	// Information about the current type annotation target, i.e. the one read
	// in the current
	// (or latest) call to {@link ClassReader#readAnnotationTarget()}.

	/**
	 * The target_type and target_info of the current type annotation target,
	 * encoded as described in {@link TypeReference}.
	 */
	int currentTypeAnnotationTarget;

	/** The target_path of the current type annotation target. */
	TypePath currentTypeAnnotationTargetPath;

	/**
	 * The start of each local variable range in the current local variable
	 * annotation.
	 */
	Label[] currentLocalVariableAnnotationRangeStarts;

	/**
	 * The end of each local variable range in the current local variable
	 * annotation.
	 */
	Label[] currentLocalVariableAnnotationRangeEnds;

	/**
	 * The local variable index of each local variable range in the current
	 * local variable annotation.
	 */
	int[] currentLocalVariableAnnotationRangeIndices;

	// Information about the current stack map frame, i.e. the one read in the
	// current (or latest)
	// call to {@link ClassReader#readFrame()}.

	/** The bytecode offset of the current stack map frame. */
	int currentFrameOffset;

	/**
	 * The type of the current stack map frame. One of {@link Opcodes#F_FULL},
	 * {@link Opcodes#F_APPEND}, {@link Opcodes#F_CHOP}, {@link Opcodes#F_SAME}
	 * or {@link Opcodes#F_SAME1}.
	 */
	int currentFrameType;

	/**
	 * The number of local variable types in the current stack map frame. Each
	 * type is represented with a single array element (even long and double).
	 */
	int currentFrameLocalCount;

	/**
	 * The delta number of local variable types in the current stack map frame
	 * (each type is represented with a single array element - even long and
	 * double). This is the number of local variable types in this frame, minus
	 * the number of local variable types in the previous frame.
	 */
	int currentFrameLocalCountDelta;

	/**
	 * The types of the local variables in the current stack map frame. Each
	 * type is represented with a single array element (even long and double),
	 * using the format described in {@link MethodVisitor#visitFrame}. Depending
	 * on {@link #currentFrameType}, this contains the types of all the local
	 * variables, or only those of the additional ones (compared to the previous
	 * frame).
	 */
	Object[] currentFrameLocalTypes;

	/**
	 * The number stack element types in the current stack map frame. Each type
	 * is represented with a single array element (even long and double).
	 */
	int currentFrameStackCount;

	/**
	 * The types of the stack elements in the current stack map frame. Each type
	 * is represented with a single array element (even long and double), using
	 * the format described in {@link MethodVisitor#visitFrame}.
	 */
	Object[] currentFrameStackTypes;
}
